package pe.gob.osce.sirenas.svc;

import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;

import pe.gob.osce.sirenas.dao.FichaArbitralDAOLocal;
import pe.gob.osce.sirenas.dao.HistorialEstadoDAOLocal;
import pe.gob.osce.sirenas.dao.IncidenciasDAOLocal;
import pe.gob.osce.sirenas.dao.ReestablecerDAOLocal;
import pe.gob.osce.sirenas.dao.convert.AuditoriaConvert;
import pe.gob.osce.sirenas.dao.convert.FichaArbitralConvert;
import pe.gob.osce.sirenas.dao.convert.IncidenciasConvert;
import pe.gob.osce.sirenas.dao.convert.ReestablecerConvert;
import pe.gob.osce.sirenas.model.AuditoriaDTO;
import pe.gob.osce.sirenas.model.FichaArbitralDTO;
import pe.gob.osce.sirenas.model.IncidenciasDTO;
import pe.gob.osce.sirenas.model.NotificacionesDTO;
import pe.gob.osce.sirenas.model.ReestablecerDTO;
import pe.gob.osce.sirenas.model.jpa.Auditoria;
import pe.gob.osce.sirenas.model.jpa.FichaArbitral;
import pe.gob.osce.sirenas.model.jpa.HistorialEstado;
import pe.gob.osce.sirenas.model.jpa.Incidencias;
import pe.gob.osce.sirenas.model.jpa.Reestablecer;
import pe.gob.osce.sirenas.util.ConstanteEJB;

/**
 * Session Bean implementation class RegistrarIncidenciaServiceImpl
 */
@Stateless(mappedName = "RegistrarIncidenciaService")
public class RegistrarIncidenciaServiceImpl implements RegistrarIncidenciaServiceLocal {
	final static Logger log = Logger.getLogger(RegistrarIncidenciaServiceImpl.class);

	@EJB
	private	ReestablecerDAOLocal	reestablecerDaoLocal;
	@EJB
	private	IncidenciasDAOLocal	incidenciasDAOLocal;
	@EJB
	private FichaArbitralDAOLocal fichaArbitralDAOLocal;
	@EJB
	private HistorialEstadoDAOLocal historialEstadoDAOLocal;
	@EJB
	private RegistrarNotificacionServiceLocal registrarNotificacionService;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	
	@Override
	public	List<IncidenciasDTO> obtenerIncidenciasFichaArbitral(FichaArbitralDTO fichaArbitralDTO)
			throws Exception {
		List<IncidenciasDTO>	listIncidencias=null;
		
		try{
			listIncidencias=incidenciasDAOLocal.listarIncidencias(fichaArbitralDTO.getIdFicha());	
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return listIncidencias;
	}
	
	public Incidencias insertIncidencia(FichaArbitralDTO fichaArbitralDTO,IncidenciasDTO incidenciasDTO,AuditoriaDTO auditoriaDTO)throws Exception{
		
		Incidencias incidencia=IncidenciasConvert.createJPA(incidenciasDTO, AuditoriaConvert.createJPA(auditoriaDTO));
		incidencia=incidenciasDAOLocal.insertIncidencia(incidencia);
		Auditoria auditoriaJPA=AuditoriaConvert.createJPA(auditoriaDTO);
				
		if(incidenciasDTO.getActualizaEstado()){
			FichaArbitral fichaArbitralJPA=null;
			fichaArbitralDTO.setIdEstadoFicha(incidencia.getIdEstadoIncidencia());	
			fichaArbitralJPA=FichaArbitralConvert.createJPA(fichaArbitralDTO, auditoriaDTO);			
			fichaArbitralJPA=fichaArbitralDAOLocal.insertarFicha(fichaArbitralJPA);		

			/**Registro el Estado Inicial de mi Ficha*/
			
			HistorialEstado historialEstado=new HistorialEstado();
			historialEstadoDAOLocal.inacticaHistorialEstado(fichaArbitralDTO.getIdFicha(), auditoriaDTO.getUsuarioRegistro());
						
			historialEstado.setIdFicha(fichaArbitralJPA.getIdFicha());
			historialEstado.setIdIncidencia(incidencia.getIdIncidencia());
			historialEstado.setFecInicio(incidenciasDTO.getFechaInicio());
			historialEstado.setFecFin(incidenciasDTO.getFechaFin());
			historialEstado.setIdEstado(fichaArbitralJPA.getIdEstadoFicha());
			historialEstado.setIndVigente(true);
			historialEstado.setEstado(fichaArbitralJPA.getEstado());
			historialEstado.setAuditoria(auditoriaJPA);
			historialEstado.setIdHistAnterior(fichaArbitralDTO.getEstadoFicha().getIdHistEstado());
			historialEstadoDAOLocal.insertHistorialEstado(historialEstado);
		}
		
		
		/**Registro de la Notificacion a bandeja*/
		NotificacionesDTO notificacionesDTO=new NotificacionesDTO();
		notificacionesDTO.setIdFicha(fichaArbitralDTO.getIdFicha());
		notificacionesDTO.setDescAsunto(propSirenas.getString(ConstanteEJB.NOTIF_INCIDENCIA));
		notificacionesDTO.setDescDetalle(propSirenas.getString(ConstanteEJB.NOTIF_DETALLE_INCIDENCIA)+"<br/>"+incidenciasDTO.getEstadoIncidencia());
		notificacionesDTO.setIndLectura(false);
		registrarNotificacionService.registrarNotificacion(notificacionesDTO, auditoriaDTO);
		/**Implemetar metodo para sacar los correos de Comunicacione sd ela fichaArbitralDTO*/
		String toEmail="jcayulla@outlook.com siskayulla@gmail.com";
		/**Registro de la Notificacion a Correo Electronico*/
		registrarNotificacionService.enviarCorreoNotificacion(toEmail, propSirenas.getString(ConstanteEJB.NOTIF_INCIDENCIA), propSirenas.getString(ConstanteEJB.NOTIF_DETALLE_GRAL));
		
		return incidencia;
	}
	

	public Incidencias desactivarIncidencia(IncidenciasDTO incidenciasDTO, FichaArbitralDTO fichaArbitralDTO,AuditoriaDTO auditoriaDTO)throws Exception{
		//Desactivo la Incidencia Seleccionada
		incidenciasDTO.setEstado(0L); //Desactivo la Incidencia
		incidenciasDTO.getAuditoriaDTO().setFecModificacion(auditoriaDTO.getFecRegistro());
		incidenciasDTO.getAuditoriaDTO().setUsuarioModificacion(auditoriaDTO.getUsuarioRegistro());
		Incidencias incidencia=IncidenciasConvert.createJPA(incidenciasDTO, AuditoriaConvert.createJPA(incidenciasDTO.getAuditoriaDTO()));
		incidencia=incidenciasDAOLocal.insertIncidencia(incidencia);
		
		//Restablesco la Ficha a su Estado Anterior
		HistorialEstado historialActual=historialEstadoDAOLocal.obtenerHistorialEstado(fichaArbitralDTO.getEstadoFicha().getIdHistEstado());
		HistorialEstado historialAnterior=historialEstadoDAOLocal.obtenerHistorialEstado(historialActual.getIdHistAnterior());
		
		//Desactivo el Historial Actual
		historialActual.setIndVigente(false);
		historialActual.getAuditoria().setFechaModifica(auditoriaDTO.getFecRegistro());
		historialActual.getAuditoria().setUsuarioModifica(auditoriaDTO.getUsuarioModificacion());
		historialEstadoDAOLocal.insertHistorialEstado(historialActual);
					
		//Activo el Historial Anterior
		historialAnterior.setIndVigente(true);
		historialAnterior.getAuditoria().setFechaModifica(auditoriaDTO.getFecRegistro());
		historialAnterior.getAuditoria().setUsuarioModifica(auditoriaDTO.getUsuarioRegistro());
		historialEstadoDAOLocal.insertHistorialEstado(historialAnterior);
		
		//Actualizo el Estado de la Ficha por del Historial Activado
		fichaArbitralDTO.setIdEstadoFicha(historialAnterior.getIdEstado());
		fichaArbitralDTO.getAuditoria().setFecModificacion(auditoriaDTO.getFecRegistro());
		fichaArbitralDTO.getAuditoria().setUsuarioModificacion(auditoriaDTO.getUsuarioRegistro());
		FichaArbitral fichaArbitralJPA=FichaArbitralConvert.createJPA(fichaArbitralDTO, fichaArbitralDTO.getAuditoria());
		fichaArbitralDAOLocal.insertarFicha(fichaArbitralJPA );
		
		return incidencia;
	}
	
	/**Logica para Reestablecimiento de Estado*/
	@Override
	public	List<ReestablecerDTO> obtenerReestablecimientosFichaArbitral(FichaArbitralDTO fichaArbitralDTO)
			throws Exception {
		List<ReestablecerDTO>	listReestablecimientos=null;
		
		try{
			listReestablecimientos=reestablecerDaoLocal.listarReestablecimientos(fichaArbitralDTO.getIdFicha());	
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return listReestablecimientos;
	}
	

	@Override
	public void insertReestablecimiento(FichaArbitralDTO fichaArbitralDTO,ReestablecerDTO reestablecerDTO,AuditoriaDTO auditoriaDTO)throws Exception{
		
		Reestablecer reestablecerJPA=ReestablecerConvert.createReestablecerJPA(reestablecerDTO, AuditoriaConvert.createJPA(auditoriaDTO));
		reestablecerJPA=reestablecerDaoLocal.insertReestablecimiento(reestablecerJPA);
		Auditoria auditoriaJPA=AuditoriaConvert.createJPA(auditoriaDTO);

		FichaArbitral fichaArbitralJPA=null;
		fichaArbitralDTO.setIdEstadoFicha(Long.parseLong(propSirenas.getString(ConstanteEJB.ID_ESTADO_REGISTRADO)));
		fichaArbitralDTO.getAuditoria().setFecModificacion(auditoriaDTO.getFecRegistro());
		fichaArbitralDTO.getAuditoria().setUsuarioModificacion(auditoriaDTO.getUsuarioRegistro() );
		fichaArbitralJPA=FichaArbitralConvert.createJPA(fichaArbitralDTO, fichaArbitralDTO.getAuditoria());			
		fichaArbitralJPA=fichaArbitralDAOLocal.insertarFicha(fichaArbitralJPA);
		
		
		/**Registro el Estado Inicial de mi Ficha*/
		
		HistorialEstado historialEstado=new HistorialEstado();
		historialEstadoDAOLocal.inacticaHistorialEstado(fichaArbitralDTO.getIdFicha(), auditoriaDTO.getUsuarioRegistro());
					
		historialEstado.setIdFicha(fichaArbitralJPA.getIdFicha());
		historialEstado.setFecInicio(new Date());
		historialEstado.setIdEstado(fichaArbitralJPA.getIdEstadoFicha());
		historialEstado.setIndVigente(true);
		historialEstado.setEstado(fichaArbitralJPA.getEstado());
		historialEstado.setAuditoria(auditoriaJPA);
		historialEstado.setIdHistAnterior(fichaArbitralDTO.getEstadoFicha().getIdHistEstado());
		historialEstadoDAOLocal.insertHistorialEstado(historialEstado);
				
		/**Registro de la Notificacion a bandeja*/
		NotificacionesDTO notificacionesDTO=new NotificacionesDTO();
		notificacionesDTO.setIdFicha(fichaArbitralDTO.getIdFicha());
		notificacionesDTO.setDescAsunto(propSirenas.getString(ConstanteEJB.NOTIF_REESTABLECER));
		notificacionesDTO.setDescDetalle(propSirenas.getString(ConstanteEJB.NOTIF_DETALLE_REESTABLECER));
		notificacionesDTO.setIndLectura(false);
		registrarNotificacionService.registrarNotificacion(notificacionesDTO, auditoriaDTO);
		/**Implemetar metodo para sacar los correos de Comunicacione sd ela fichaArbitralDTO*/
		String toEmail="jcayulla@outlook.com siskayulla@gmail.com";
		/**Registro de la Notificacion a Correo Electronico*/
		registrarNotificacionService.enviarCorreoNotificacion(toEmail, propSirenas.getString(ConstanteEJB.NOTIF_REESTABLECER), propSirenas.getString(ConstanteEJB.NOTIF_DETALLE_GRAL));
		
	}
}
